home *** CD-ROM | disk | FTP | other *** search
/ Scene 96 / Scene 96 International Edition (Zyklop Software) (Disc 2) (1997).iso / misc / coding / vgacodng / part05_a.pas < prev    next >
Pascal/Delphi Source File  |  1996-12-15  |  4KB  |  122 lines

  1. {$G+}
  2. program Mode_X;
  3.  
  4. uses crt;
  5.  
  6. var x,y,dirx,diry : word;
  7.  
  8. procedure SetModeX;assembler;
  9. asm
  10.   mov     ax,13h        { Zuerst den normalen Modus 13h per BIOS aktivieren }
  11.   int     10h
  12.   mov     dx,3C4h
  13.   mov     al,4                         { TS-Register 4 anwählen }
  14.   out     dx,al
  15.   inc     dx
  16.   in      al,dx                        { Aktuellen Registerinhalt holen }
  17.   and     al,0F7h                      { Bit 2 setzen, Bit 3 löschen }
  18.   or      al,4
  19.   out     dx,al                        { Werte zurückschreiben }
  20.   dec     dx
  21.   mov     ax,0F02h
  22.   out     dx,ax                        { Alle Planes selektieren }
  23.   mov     ax,0A000h                    { VGA-Segment nach ES }
  24.   mov     es,ax
  25.   xor     di,di
  26.   xor     ax,ax
  27.   mov     cx,0FFFFh
  28.   cld
  29.   rep     stosw                        { Bildschirm löschen }
  30.   mov     dx,3D4h
  31.   mov     al,14h                       { CRTC-Register 14h anwählen }
  32.   out     dx,al
  33.   inc     dx
  34.   in      al,dx                        { Aktuellen Registerinhalt holen }
  35.   and     al,0BFh                      { Bit 6 löschen }
  36.   out     dx,al
  37.   dec     dx
  38.   mov     al,17h                       { CRTC-Register 17h anwählen }
  39.   out     dx,al
  40.   inc     dx
  41.   in      al,dx
  42.   or      al,40h                       { Bit 6 setzen }
  43.   out     dx,al
  44. end;
  45.  
  46. procedure XPutPixel(x,y:integer;col:byte);assembler;
  47. asm
  48.   mov     ax,0A000h                    { VGA-Segment nach ES }
  49.   mov     es,ax
  50.   mov     cx,x                         { X-Koord nach CX }
  51.   and     cx,3                         { Plane bestimmen }
  52.   mov     ax,1
  53.   shl     ax,cl                        { Entsprechendes Bit setzen }
  54.   mov     ah,al
  55.   mov     dx,03C4h
  56.   mov     al,2                         { Timing-Sequencer Reg. 2 anwählen }
  57.   out     dx,ax                        { Plane setzen }
  58.   mov     ax,80                        { Pixel-Offset bestimmen }
  59.   mul     y                            { Offset = y * 80 + x div 4 }
  60.   mov     di,ax                        { y * 80 nach DI }
  61.   mov     ax,x
  62.   shr     ax,2                         { entspricht AX div 4 }
  63.   add     di,ax                        { x div 4 dazuzählen }
  64.   mov     al,col                       { Farbe nach AL }
  65.   mov     es:[di],al                   { Pixel setzen }
  66. end;
  67.  
  68. procedure XSetStart(Adr:word);assembler;
  69. asm
  70.   mov     dx,3D4h
  71.   mov     al,0Ch                       { CRTC-Register 0Ch }
  72.   mov     ah,byte ptr Adr + 1          { Bits 15-8 abschicken }
  73.   out     dx,ax
  74.   mov     al,0Dh                       { CRTC-Register 0Dh }
  75.   mov     ah,byte ptr Adr              { Bits 7-0 abschicken }
  76.   out     dx,ax
  77. end;
  78.  
  79. procedure XDouble;assembler;
  80. asm
  81.   mov     dx,3D4h                      { CRTC-Register 13h anwählen }
  82.   mov     ax,5013h                     { auf 80 setzen (doppelte Breite) }
  83.   out     dx,ax
  84. end;
  85.  
  86. procedure WaitRetrace;assembler;
  87. asm
  88.   mov     dx,3DAh
  89. @l1:
  90.   in      al,dx
  91.   and     al,08h
  92.   jz      @l1
  93. @l2:
  94.   in      al,dx
  95.   and     al,08h
  96.   jz      @l2
  97. end;
  98.  
  99.  
  100. begin
  101.   setmodex;                            { Mode-X setzen }
  102.   xdouble;                             { 160-Byte Modus einschalten }
  103.   for x := 0 to 319 do                 { Alle 4 Pages mit Müll füllen }
  104.     for y := 0 to 799 do xputpixel(x,y,random(256));
  105.   x := 1;                              { Startposition }
  106.   y := 160;
  107.   dirx := 1;
  108.   diry := 160;
  109.   repeat
  110.     inc(x,dirx);                       { Bildausschnitt weiterbewegen }
  111.     inc(y,diry);
  112.     delay(10);
  113.     WaitRetrace;
  114.     XSetStart(y+x);                    { Neue Startadresse setzen }
  115.     if (x = 80) or (x = 1) then dirx := -dirx;
  116.     if (y = 32000) or (y = 160) then diry := -diry;
  117.     { Richtung umkehren, wenn am Rand angekommen }
  118.   until keypressed;
  119.   readkey;
  120.   asm mov ax,3; int 10h end;
  121. end.
  122.